home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / pmake / customs / xdr.c < prev   
Encoding:
C/C++ Source or Header  |  1989-11-15  |  4.0 KB  |  170 lines

  1. /*-
  2.  * xdr.c --
  3.  *    Functions for encoding and decoding data between customs
  4.  *    agents and their clients.
  5.  *
  6.  * Copyright (c) 1988, 1989 by the Regents of the University of California
  7.  * Copyright (c) 1988, 1989 by Adam de Boor
  8.  * Copyright (c) 1989 by Berkeley Softworks
  9.  *
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any non-commercial purpose
  12.  * and without fee is hereby granted, provided that the above copyright
  13.  * notice appears in all copies.  The University of California,
  14.  * Berkeley Softworks and Adam de Boor make no representations about
  15.  * the suitability of this software for any purpose.  It is provided
  16.  * "as is" without express or implied warranty.
  17.  */
  18. #ifndef lint
  19. static char *rcsid =
  20. "$Id: xdr.c,v 1.10 89/11/14 13:46:23 adam Exp $ SPRITE (Berkeley)";
  21. #endif lint
  22.  
  23. #include    "customs.h"
  24. #include    "log.h"
  25. #include    <sys/time.h>
  26.  
  27.  
  28. /*-
  29.  *-----------------------------------------------------------------------
  30.  * xdr_exportpermit --
  31.  *    encode/decode an ExportPermit structure.
  32.  *
  33.  * Results:
  34.  *    TRUE.
  35.  *
  36.  * Side Effects:
  37.  *    Of course.
  38.  *
  39.  *-----------------------------------------------------------------------
  40.  */
  41. bool_t
  42. xdr_exportpermit (xdrs, permitPtr)
  43.     XDR              *xdrs;
  44.     ExportPermit  *permitPtr;
  45. {
  46.     if (xdrs->x_op == XDR_FREE) {
  47.     return TRUE;
  48.     } else {
  49.     return (xdr_in_addr (xdrs, &permitPtr->addr) &&
  50.         xdr_u_long (xdrs, &permitPtr->id));
  51.     }
  52. }
  53.  
  54.  
  55. /*-
  56.  *-----------------------------------------------------------------------
  57.  * xdr_in_addr --
  58.  *    encode an in_addr structure.
  59.  *
  60.  * Results:
  61.  *    TRUE.
  62.  *
  63.  * Side Effects:
  64.  *
  65.  *-----------------------------------------------------------------------
  66.  */
  67. bool_t
  68. xdr_in_addr (xdrs, addrPtr)
  69.     XDR                  *xdrs;
  70.     struct in_addr    *addrPtr;
  71. {
  72.     if (xdrs->x_op == XDR_FREE) {
  73.     return TRUE;
  74.     } else {
  75.     return xdr_opaque (xdrs, addrPtr, sizeof(struct in_addr));
  76.     }
  77. }
  78.  
  79. /*-
  80.  *-----------------------------------------------------------------------
  81.  * xdr_sockaddr_in --
  82.  *    encode/decode a sockaddr_in structure.
  83.  *
  84.  * Results:
  85.  *    TRUE if ok. FALSE otherwise.
  86.  *
  87.  * Side Effects:
  88.  *    None....
  89.  *
  90.  *-----------------------------------------------------------------------
  91.  */
  92. bool_t
  93. xdr_sockaddr_in (xdrs, siPtr)
  94.     XDR                  *xdrs;
  95.     struct sockaddr_in    *siPtr;
  96. {
  97.     if (xdrs->x_op != XDR_FREE) {
  98.     return (xdr_short (xdrs, &siPtr->sin_family) &&
  99.         xdr_u_short (xdrs, &siPtr->sin_port) &&
  100.         xdr_in_addr (xdrs, &siPtr->sin_addr));
  101.     }
  102. }
  103. /*-
  104.  *-----------------------------------------------------------------------
  105.  * xdr_strvec --
  106.  *    encode/decode a string vector. The address of the vector must be
  107.  *    passed. On XDR_ENCODE, the vector must be null-terminated. On
  108.  *    XDR_DECODE, the resulting vector will be null-terminated. That's
  109.  *    what a vector is...
  110.  *
  111.  * Results:
  112.  *    TRUE if ok. FALSE otherwise.
  113.  *
  114.  * Side Effects:
  115.  *    Memory may be allocated...
  116.  *
  117.  *-----------------------------------------------------------------------
  118.  */
  119. bool_t
  120. xdr_strvec (xdrs, vecPtr)
  121.     XDR        *xdrs;
  122.     char    ***vecPtr;
  123. {
  124.     register short    i;
  125.     register char     **vec;
  126.     short             cnt;
  127.     short             len;
  128.     bool_t            rval;
  129.  
  130.     vec = *vecPtr;
  131.  
  132.     switch (xdrs->x_op) {
  133.     case XDR_FREE:
  134.         if ((short *)vec < &len && vec != (char **)0) {
  135.         free ((char *)vec);
  136.         }
  137.         return TRUE;
  138.     case XDR_ENCODE:
  139.         for (i = 0; vec[i] != (char *)0; i++) {
  140.         continue;
  141.         }
  142.         cnt = i;
  143.         rval = xdr_short (xdrs, &cnt);
  144.         for (i = 0; i < cnt; i++) {
  145.         len = strlen (vec[i]);
  146.         rval = rval && xdr_short (xdrs, &len);
  147.         rval = rval && xdr_opaque (xdrs, vec[i], len);
  148.         }
  149.         return rval;
  150.     case XDR_DECODE:
  151.         rval = xdr_short (xdrs, &cnt);
  152.         if (rval && vec == (char **)0) {
  153.         *vecPtr = vec = (char **)malloc ((cnt + 1) * sizeof(char *));
  154.         bzero ((char *)vec, (cnt + 1) * sizeof (char *));
  155.         }
  156.         for (i = 0; i < cnt; i++) {
  157.         rval = rval && xdr_short (xdrs, &len);
  158.         if (rval && vec[i] == (char *)0) {
  159.             vec[i] = (char *)malloc (len + 1);
  160.             vec[i][len] = '\0';
  161.         }
  162.         rval = rval && xdr_opaque (xdrs, vec[i], len);
  163.         }
  164.         return rval;
  165.     }
  166.     return FALSE;
  167. }
  168.  
  169.         
  170.